package com.zhongjian.technologycal.mall.utils;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;

/**
 *
 */

public class ShakeHelper implements SensorEventListener {
    private Context mContext;
//    //传感器管理器
    private SensorManager mSensorManager;
//    //传感器
    private Sensor mSensor;
//    //速度阀值
//    private int mSpeed = 5000;
//    //时间间隔
//    private int mInterval = 2000;
//    //上一次摇晃的时间
//    private long LastTime;
//    //上一次的x、y、z坐标
//    private float LastX, LastY, LastZ;
//    private final int ROCKPOWER = 12;// 传感器系数
    private ShakeListener sl;

    /**
     * 检测的时间间隔
     */
    static final int UPDATE_INTERVAL = 100;
    /**
     * 上一次检测的时间
     */
    long mLastUpdateTime;
    /**
     * 上一次检测时，加速度在x、y、z方向上的分量，用于和当前加速度比较求差。
     */
    float mLastX, mLastY, mLastZ;

    /**
     * 摇晃检测阈值，决定了对摇晃的敏感程度，越小越敏感。
     */
    public int shakeThreshold = 4000;



    public ShakeHelper(Context mContext, ShakeListener sl) {
        this.mContext = mContext;
        this.sl = sl;
        Start();
    }

    public void Start() {
        mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
        if (mSensorManager != null) {
            mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        }
        if (mSensor != null) {
//            mSensorManager.registerListener(sl, mSensor, SensorManager.SENSOR_DELAY_GAME);
            mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), mSensorManager.SENSOR_DELAY_NORMAL);
        }
    }

    public void Stop() {
        mSensorManager.unregisterListener(this);
    }
    public void Pause() {
        mSensorManager.unregisterListener(this);
    }
    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) {

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
//        if (System.currentTimeMillis() > (LastTime + 2000)) {//5秒 内不在处理
//            LastTime = System.currentTimeMillis();
//            int sensorType = event.sensor.getType();
//            // values[0]:X轴，values[1]：Y轴，values[2]：Z轴
//            float[] values = event.values;
//            if (sensorType == Sensor.TYPE_ACCELEROMETER) {
//                if ((Math.abs(values[0]) > ROCKPOWER || Math.abs(values[1]) > ROCKPOWER || Math.abs(values[2]) > ROCKPOWER)) {
//                    if(null != sl){
//                        sl.shakeListener();
//                    }
//
//                }
//
//            }
//
//        }
        long currentTime = System.currentTimeMillis();
        long diffTime = currentTime - mLastUpdateTime;
        if (diffTime < UPDATE_INTERVAL) {
            return;
        }
        mLastUpdateTime = currentTime;
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
        float deltaX = x - mLastX;
        float deltaY = y - mLastY;
        float deltaZ = z - mLastZ;
        mLastX = x;
        mLastY = y;
        mLastZ = z;
        float delta = (float) (Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / diffTime * 10000);
        // 当加速度的差值大于指定的阈值，认为这是一个摇晃
        if (delta > shakeThreshold) {
            sl.shakeListener();
        }


    }

    public interface ShakeListener {
        void shakeListener();
    }

}
